package com.mokairui.share_model__routines.reentrant_lock;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Description
 *      锁可打断
 *      锁可超时
 *      公平锁是解决饥饿问题, 阻塞队列中等待的线程默认是不会根据线程进来的先后顺序来分配锁的, 而是竞争
 *          new ReentrantLock(true) 开启公平锁
 *          new ReentrantLock(false) 不开启公平锁 默认
 * @Author Mokairui
 * @Since 2021/8/3
 */
@Slf4j(topic = "c.ReentrantLock")
public class ReentrantLockDemo {
    //
    private static ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            try {
                log.debug("尝试获取锁");
                /*
                    lock.lockInterruptibly():
                        如果没有竞争那么此方法就会获取到lock对象锁
                        如果有竞争就会进入阻塞队列，可以被其他线程使用interrupt 打断
                    lock.lock()
                        不会被其他线程使用interrupted方法打断

                    lock.tryLock() lock.tryLock(timeout); 尝试获取锁返回为boolean可以设置锁超时
                 */
                lock.lockInterruptibly();
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }

            try {
                log.debug("t1线程获取到了锁");
            } finally {
                lock.unlock();
            }
        }, "t1");

        t1.start();

        lock.lock();
        TimeUnit.SECONDS.sleep(2);
        log.debug("主线程释放了锁");
        lock.unlock();

        t1.interrupt();
    }
}
